#pragma once
#include <string>
#include <memory> // std::auto_ptr
#include <cstdlib> // std::exit
#include <iostream>
#include <odb/database.hxx>
#include <odb/mysql/database.hxx>
#include "../../../common/logger.hpp"

namespace mag
{
    // ODBFactory 类用于创建和管理数据库连接的工厂类
    class ODBFactory
    {
    public:
        // 静态方法，创建并返回一个共享指针类型的数据库连接对象
        // 参数包括：数据库用户、密码、主机地址、数据库名、字符集、端口号和连接池大小
        static std::shared_ptr<odb::core::database> create(
            const std::string &user,        // 数据库用户名
            const std::string &pswd,        // 数据库密码
            const std::string &host,        // 数据库主机地址
            const std::string &db,          // 数据库名称
            const std::string &cset,        // 数据库字符集
            int port,                       // 数据库端口号
            int conn_pool_count             // 连接池中连接的数量
        )
        {
            // 创建一个独立的 MySQL 连接池工厂对象，负责管理数据库连接池
            // conn_pool_count：指定连接池的大小
            // 0 表示不限制连接数
            std::unique_ptr<odb::mysql::connection_pool_factory> cpf(
                new odb::mysql::connection_pool_factory(conn_pool_count, 0)
            );

            // 创建并返回一个共享指针的数据库对象
            // 传入数据库连接所需的各类信息，包括用户名、密码、数据库名、主机、端口、字符集等
            auto res = std::make_shared<odb::mysql::database>(
                user,         // 用户名
                pswd,         // 密码
                db,           // 数据库名
                host,         // 主机地址
                port,         // 端口号
                "",           // 默认的 UNIX socket，留空表示使用 TCP/IP
                cset,         // 字符集
                0,            // 不使用额外选项（例如 SSL）
                std::move(cpf) // 传递管理连接池的工厂对象
            );

            // 返回创建的数据库对象
            return res;
        }
    };
}
